package cn.qiao.benchmark;

import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPipelineException;

import java.util.function.Consumer;

public class RedisPipelineUtil {
    private  RedisConnectionFactory redisConnectionFactory;
    /**
     * 执行 RedisConnection 的 pipeline 操作。
     *
     * @param connection RedisConnection 实例
     * @param pipelineOps 用于执行 pipeline 操作的函数式接口
     * @param <T> 返回结果的类型
     * @return 执行 pipeline 操作的结果
     */
    public static <T> T executePipeline(RedisConnection connection, PipelineOps<T> pipelineOps) {
        connection.openPipeline();
        try {
            // 执行 pipeline 操作
            T result = pipelineOps.apply(connection);
            return result;
        } catch (Exception e) {
            throw new RedisPipelineException("Error during pipeline execution", e);
        } finally {
            connection.closePipeline();
        }
    }

    /**
     * 定义一个函数式接口，用于执行 pipeline 操作。
     *
     * 这是一个函数式接口的定义，使用 @FunctionalInterface 注解标识，表示该接口用于支持函数式编程风格，即可以用作 Lambda 表达式的目标。
     *
     * 具体来说，这个接口名字是 PipelineOps，定义了一个泛型类型 T，表示返回结果的类型。接口中有一个抽象方法 T apply(RedisConnection connection)，该方法接受一个 RedisConnection 参数，并返回一个泛型类型的结果。
     *
     * 这种函数式接口的定义常用于支持函数作为参数传递，可以通过 lambda 表达式实现这个接口的实例，从而方便地将一段逻辑传递给一个方法。
     *
     * 在上述的 executePipeline 方法中，PipelineOps 被用作参数，用于执行 Redis 的 pipeline 操作。用户可以通过 lambda 表达式提供自定义的 pipeline 操作，而不需要显式地创建类实现 PipelineOps 接口。这样的设计可以更灵活地使用函数式编程的特性。
     *
     *
     * @param <T> 返回结果的类型
     */
    @FunctionalInterface
    public interface PipelineOps<T> {
        T apply(RedisConnection connection);
    }

    /**
     * 自定义异常类，用于封装 Redis pipeline 操作中的异常。
     */
    public static class RedisPipelineException extends RuntimeException {
        public RedisPipelineException(String message, Throwable cause) {
            super(message, cause);
        }
    }

    public static void main(String[] args) {
        // 示例使用：执行一个 pipeline 操作
        RedisConnection redisConnection = null;/* 获取 RedisConnection 的方法 */;
        String result = executePipeline(redisConnection, connection -> {
            // 在这里执行 pipeline 操作，例如：
            connection.set("key1".getBytes(), "value1".getBytes());
            connection.get("key2".getBytes());
            // 返回结果
            return new String(connection.get("key1".getBytes()));
        });

        System.out.println("Pipeline Result: " + result);
    }
}
